import logging
import argparse
import sys
from pathlib import Path
from data_loader import DataLoader
from encryption import EncryptionHandler
from communication import Client
from config import LOG_LEVEL, LOG_FORMAT, LOG_DIR, DATA_DIR

# 配置日志
logging.basicConfig(
    level=LOG_LEVEL,
    format=LOG_FORMAT,
    handlers=[
        logging.FileHandler(Path(LOG_DIR) / "app.log"),
        logging.StreamHandler()
    ]
)

logger = logging.getLogger(__name__)

def validate_file_path(file_path: str) -> str:
    """验证并返回有效的文件路径"""
    # 转换为Path对象
    path = Path(file_path)
    
    # 如果路径不是绝对路径，尝试相对于DATA_DIR
    if not path.is_absolute():
        path = Path(DATA_DIR) / path
        
    # 检查文件是否存在
    if not path.exists():
        # 尝试在data目录下查找
        data_files = list(Path(DATA_DIR).glob('**/*.csv'))
        if data_files:
            print("\n可用的数据文件:")
            for i, file in enumerate(data_files, 1):
                print(f"{i}. {file.relative_to(DATA_DIR)}")
            print(f"\n请使用以下格式运行程序:")
            print(f"python main.py data/文件名.csv")
        else:
            print(f"\n错误: 文件 '{file_path}' 不存在")
            print(f"请确保文件位于 {DATA_DIR} 目录下")
        sys.exit(1)
        
    return str(path)

def process_data(file_path: str, encrypt: bool = True) -> dict:
    """处理数据并生成报告"""
    try:
        # 初始化处理器
        data_loader = DataLoader()
        encryption_handler = EncryptionHandler()
        
        # 加载数据
        logger.info(f"正在加载数据文件: {file_path}")
        data = data_loader.load_data(file_path)
        
        # 提取元数据
        logger.info("正在提取元数据")
        metadata = data_loader.extract_metadata(data)
        
        # 生成元数据哈希
        metadata_hash = encryption_handler.hash_metadata(metadata)
        
        # 加密数据（如果需要）
        if encrypt:
            logger.info("正在加密数据")
            encrypted_data = encryption_handler.encrypt_data(data.to_dict())
            
            return {
                "encrypted_data": encrypted_data,
                "metadata_hash": metadata_hash
            }
        else:
            # 对于未加密的数据，仍然需要加密后发送
            logger.info("正在加密未加密的数据")
            encrypted_data = encryption_handler.encrypt_data(data.to_dict())
            return {
                "encrypted_data": encrypted_data,
                "metadata_hash": metadata_hash
            }
            
    except Exception as e:
        logger.error(f"数据处理失败: {str(e)}")
        raise

def main():
    parser = argparse.ArgumentParser(
        description="隐私保护数据质量检查系统",
        formatter_class=argparse.RawDescriptionHelpFormatter,
        epilog="""
示例:
  python main.py data/example_data.csv     # 使用加密模式
  python main.py data/example_data.csv --no-encrypt  # 不使用加密
        """
    )
    parser.add_argument("file_path", help="数据文件路径 (相对于data目录)")
    parser.add_argument("--no-encrypt", action="store_true", help="不加密数据（不推荐）")
    
    args = parser.parse_args()
    
    try:
        # 验证文件路径
        valid_file_path = validate_file_path(args.file_path)
        
        # 处理数据
        result = process_data(valid_file_path, not args.no_encrypt)
        logger.info("数据处理完成")
        
        # 创建客户端并发送数据
        client = Client()
        client.send_data(result)
        logger.info("数据已成功发送到服务器")
                
    except Exception as e:
        logger.error(f"程序执行失败: {str(e)}")
        print(f"\n错误: {str(e)}")
        print("请查看日志文件获取详细信息")
        sys.exit(1)

if __name__ == "__main__":
    main() 